/**
 * <p>文件名:		ConvertTools.java</p>
 * <p>版权:		CopyrightTag</p>
 * <p>公司:		北京掌城科技PalmCity</p>
 * @author		韩鹏(hanpeng@ctfo.com, hanhaipeng-2005@163.com)
*/

package com.palmcity.rtti.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.List;
import java.util.zip.GZIPInputStream;

import org.apache.log4j.Logger;

/**
 * <p>ConvertTools</p>
 * <p>用途：DTI信息转换工具类 </p>
 *
 * @author		韩鹏(hanpeng@ctfo.com, hanpeng@163.com)
 * @version		0.0.1  2014-9-22
 * <table style="border:1px solid gray;">
 * <tr>
 * <th width="100px">版本号</th><th width="100px">动作</th><th width="100px">修改人</th><th width="100px">修改时间</th>
 * </tr>
 * <!-- 以 Table 方式书写修改历史 -->
 * <tr>
 * <td>0.0.0</td><td>创建类</td><td>zhb</td><td>2014-9-22 下午5:24:48</td>
 * </tr>
 * <tr>
 * <td>0.0.1</td><td>创建类</td><td>zhb</td><td>2014-9-22 下午5:24:48</td>
 * <td>0.0.2</td><td>修改类</td><td>xxx</td><td>x年x月x日</td>
 * </tr>
 * </table>
 */
public class TrafficUtils {

	protected static Logger info_log = Logger.getLogger(TrafficUtils.class);
	
	/** 1分钟包含的秒数 */
	public static final int ONE_MINUTE_SECONDS = 60;
	
	/** 1小时包含的分钟数 */
	public static final int ONE_HOUR_MINUTES = 60;

	/** 1天包含的小时数 */
	public static final int ONE_DAY_HOURS = 24;
	
	/** 1天包含的秒数 */
	public static final int ONE_DAY_SECONDS = ONE_DAY_HOURS*ONE_HOUR_MINUTES*ONE_MINUTE_SECONDS;
	
	/** 1周包含的天数 */
	public static final int ONE_WEEK_DAYS = 7; 
	/**
	 * 获取路况代码 
	 * @param condition
	 * @return
	 */
	public static char getRoadCondition(int condition){
		if(condition == 3){
			return 'A';
		}else if(condition == 2){
			return 'B';
		}else if(condition == 1){
			return 'C';
		}
		return 'Z';
	}
	
	/**
	 * 将dti协议道路等级转换成实际道路等级 ，注意有加1
	 * dti协议道路等级 0 1 2 3 4 5 (6未定义) 
	 * 实际路网道路等级  1 2 3 4 5 6 (0未定义)
	 * @param roadClass dti协议的道路等级
	 * @return
	 */
	public static int getRealRoadClass(int roadClass){
		if(roadClass >= 6){
			return 0;
		}else{
			return roadClass+1;
		}
	}
	/**
	 * 将实际道路等级转换成dti协议的道路等级，注意有减1
	 * 实际路网道路等级  1 2 3 4 5 6 (0未定义)
	 * dti协议道路等级 0 1 2 3 4 5 (6未定义) 
	 * @param rc 实际道路等级rc
	 * @return
	 */
	public static int getDtiRoadClass(int rc) {
		if (rc != 0) {
			return (rc - 1);
		} else {
			return 6;
		}
	}
	/**
	 * 计算网格号 
	 * @param programData
	 * @param cursor
	 * @return
	 */
	public static int getGridID(List<Byte> programData, int cursor){
		/**
		 * 列编号的低8位
		 */
		byte lowy = programData.get(cursor++);
		/**
		 * 行编号的低8位
		 */
		byte lowx = programData.get(cursor++);
		/**
		 * 列编号的高4位
		 */
		byte highy = (byte) (programData.get(cursor) >> 4);
		/**
		 * 行编号的高4位
		 */
		byte highx = (byte) (programData.get(cursor) & 0x0f);
		/**
		 * 列编号的二次网格号
		 */
		int secondGridIDy = lowy & 0x07;
		/**
		 * 列编号的一次网格号
		 */
		
		int firstGridIDy = (highy << 5) | ((lowy & 0xf8) >>> 3) ;
		/**
		 * 行编号的二次网格号
		 */
		int secondGridIDx = lowx & 0x07;
		/**
		 * 行编号的一次网格号
		 */
		int firstGridIDx = (highx << 5) | ((lowx & 0xf8) >>> 3);

		return firstGridIDx * 10000 + firstGridIDy * 100 + secondGridIDx
				* 10 + secondGridIDy;
	}
	/**
	 * 根据数组解析网格标号 
	 * @param programData
	 * @param cursor	游标位置
	 * @return int	meshid
	 */
	public static int getGridID(byte[] programData, int cursor){
		/**
		 * 列编号的低8位
		 */
		byte lowy = programData[cursor++];
		/**
		 * 行编号的低8位
		 */
		byte lowx = programData[cursor++];
		/**
		 * 列编号的高4位
		 */
		byte highy = (byte) (programData[cursor] >> 4);
		/**
		 * 行编号的高4位
		 */
		byte highx = (byte) (programData[cursor] & 0x0f);
		/**
		 * 列编号的二次网格号
		 */
		int secondGridIDy = lowy & 0x07;
		/**
		 * 列编号的一次网格号
		 */
		
		int firstGridIDy = (highy << 5) | ((lowy & 0xf8) >>> 3) ;
		/**
		 * 行编号的二次网格号
		 */
		int secondGridIDx = lowx & 0x07;
		/**
		 * 行编号的一次网格号
		 */
		int firstGridIDx = (highx << 5) | ((lowx & 0xf8) >>> 3);
		return firstGridIDx * 10000 + firstGridIDy * 100 + secondGridIDx
				* 10 + secondGridIDy;
	}
	/**
	 * 解压缩文件
	 * @param inFileName
	 * @throws IOException 
	 */
	public static byte[] doUnGzipFile(InputStream in,int bufSize) throws IOException {
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		GZIPInputStream gis = new GZIPInputStream(in);
		int count = 0;
		byte data[] = new byte[bufSize];
		while ((count = gis.read(data)) != -1) {
			os.write(data, 0, count);
			Arrays.fill(data,(byte)0);
		}
		os.flush();
		os.close();
		return os.toByteArray();
	}
	
	
	public static String getHHMM(int timeId, double interval) {
		DecimalFormat deciformat = new DecimalFormat("00");
		String strPublishTime = deciformat
				.format((int) ((timeId) * interval / ONE_HOUR_MINUTES))
				+ ":"
				+ deciformat.format((timeId) * interval % ONE_HOUR_MINUTES);
		return strPublishTime;
	}
}
